package it.controllocredito.backend.phone.calllog;

/*
 * LEGENDA:
 * >> Inizio blocco 
 * << Fine   blocco
 * Esempi di commenti utilizzati:
 
// ________________________________________________________________________________________________________________>>
 
// ******************************************************************************************************************
// *** 											        COSTANTS: 											      ***
// ***									      Propieta' statiche della classe 									  ***
// ******************************************************************************************************************


private static final String ESEMPIO   =  "Questo e un esempio";
// _______________________________________________________________________________________________________________<< 
 
  
  
  
// ________________________________________________________________________________________________________________>>
 
// ******************************************************************************************************************
// *** 											        METODI: 											      ***
// ***									      Metodi di utilita della classe  									  ***
// ******************************************************************************************************************

/**
 * Metodo che restituisce il cursore
 * @param  parameters: Array di stringhe con i valori che vogliamo recuperare dal db 
 * @return Cursore con i suoi dati recuperati della query
 */

// public Cursor managedCursor(String[] parameters)
// {
//		Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,parameters, null, null, CallLog.Calls.DEFAULT_SORT_ORDER);
	
//		return cursor;
	
// }

// _______________________________________________________________________________________________________________<< 

import it.controllocredito.backend.utility.Utility;

import java.util.ArrayList;
import java.util.LinkedHashMap;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.BaseColumns;
import android.provider.CallLog;

/***
 * @author Antonio Sulla
 * @category classe di utilita
 
 * Classe che si occupa di gestire il registro chiamate, 
 * contiene metodi per gestione delle chiamate, sms e altro.
 */
public class CallLogHandler
{
	
	// ******************************************************************************************************************
	// *** 											        PROPIETA': 											      ***
	// ***									      Propieta' private della classe 									  ***
	// ******************************************************************************************************************
	
	private Cursor cursor;
	
	private String[] parametriEstrazioneQuery;
	
	private String whereQuery;
	
	private ContentResolver contentResolver;
	
	private boolean[] filtroTipoChiamata;
	
	// ******************************************************************************************************************
	// *** 											        COSTRUTTORI: 										      ***
	// ***									      Costruttore default e parametrizzati della classe 				  ***
	// ******************************************************************************************************************
	
	/**
	 * Costruttore di default
	 */
	public CallLogHandler()
	{
		super();
		init();
		
	}
	
	
	/**
	 * Costruttore parametrizzato
	 * @param filtroTipoChiamata: tipo di chiamate
	 */
	public CallLogHandler(boolean[] filtroTipoChiamata)
	{
		super();
		this.filtroTipoChiamata  = filtroTipoChiamata;
		init();
		
	}
	
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 */
	public CallLogHandler(ContentResolver contentResolver)
	{
		super();
		this.contentResolver = contentResolver;
		init();
		
	}
	
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param filtroTipoChiamata: tipo di chiamate
	 */
	public CallLogHandler(ContentResolver contentResolver, boolean[] filtroTipoChiamata)
	{
		super();
		this.contentResolver = contentResolver;
		this.filtroTipoChiamata  = filtroTipoChiamata;
		init();
		
	}
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param whereQuery: Condizione della query
	 */
	public CallLogHandler(ContentResolver contentResolver,String whereQuery)
	{
		super();
		this.contentResolver = contentResolver;
		init(whereQuery);
		
	}
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param filtroTipoChiamata: tipo di chiamate
	 * @param whereQuery: Condizione della query
	 */
	public CallLogHandler(ContentResolver contentResolver,boolean[] filtroTipoChiamata, String whereQuery)
	{
		super();
		this.contentResolver = contentResolver;
		this.filtroTipoChiamata  = filtroTipoChiamata;
		init(whereQuery);
		
	}
		
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 */
	public CallLogHandler(ContentResolver contentResolver, String[] parametriEstrazioneQuery)
	{
		super();
		this.contentResolver = contentResolver;
		init(parametriEstrazioneQuery);	
	}
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param filtroTipoChiamata: tipo di chiamate
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 */
	public CallLogHandler(ContentResolver contentResolver, boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery)
	{
		super();
		this.contentResolver = contentResolver;
		this.filtroTipoChiamata = filtroTipoChiamata;
		init(parametriEstrazioneQuery);	
	}
	
	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 * @param whereQuery: Condizione della query
	 */
	public CallLogHandler(ContentResolver contentResolver, String[] parametriEstrazioneQuery, String whereQuery)
	{
		super();
		this.contentResolver = contentResolver;
		init(parametriEstrazioneQuery, whereQuery);				
	}

	/**
	 * Costruttore parametrizzato
	 * @param contentResolver: utilizzato per risolvere il contentResolver importato da fuori
	 * @param filtroTipoChiamata: tipo di chiamate
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 * @param whereQuery: Condizione della query
	 */
	public CallLogHandler(ContentResolver contentResolver, boolean[] filtroTipoChiamata, String[] parametriEstrazioneQuery, String whereQuery)
	{
		super();
		this.contentResolver = contentResolver;
		this.filtroTipoChiamata = filtroTipoChiamata;
		init(parametriEstrazioneQuery, whereQuery);				
	}
	
	// ******************************************************************************************************************
	// *** 											        METODI:  											      ***
	// ***									      Metodi di utilita' per la classe 									  ***
	// ******************************************************************************************************************
	
	/**
	 * Metodo che inizializza e costruisce
	 */
	private void init()
	{	
		
		if ((whereQuery != null) && (whereQuery.trim().equals("")))
				 whereQuery = null;
	
		if (parametriEstrazioneQuery == null)
		{
				parametriEstrazioneQuery = new String[] 
							{BaseColumns._ID, CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DURATION, CallLog.Calls.DATE};
		}
		
		if (filtroTipoChiamata == null)
		{
			filtroTipoChiamata = new boolean[] {true, true, true, true};
		}
		
		creaCursore();
	}
	
	/**
	 * Metodo che inizializza e costruisce
	 * @param whereQuery: Parametri di estrazione query
	 */
	private void init(String whereQuery)
	{
		this.whereQuery = whereQuery;
		init();
	}
	
	/**
	 * Metodo che inizializza e costruisce
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 */
	private void init(String[] parametriEstrazioneQuery)
	{
		this.parametriEstrazioneQuery = parametriEstrazioneQuery;
		init();
	}

	/**
	 * Metodo che inizializza e costruisce
	 * @param parametriEstrazioneQuery: Parametri di estrazione query
	 * @param whereQuery: Parametri di estrazione query
	 */
	private void init(String[] parametriEstrazioneQuery, String whereQuery)
	{
		this.parametriEstrazioneQuery = parametriEstrazioneQuery;
	
		this.whereQuery = whereQuery;
		
		init();
	}

	/**
	 * Metodo che restituisce il cursore
	 */
	private void creaCursore()
	{
		cursor = contentResolver.query(
				CallLog.Calls.CONTENT_URI,parametriEstrazioneQuery, whereQuery, null, CallLog.Calls.DEFAULT_SORT_ORDER);
		
	}

	/**
	 * Metodo di controllo per filtrare il tipo di chiamata
	 * @param type Tipo di chiamata. Ci restituisce un numero che corrisponde a:
	 * OUTGOING_TYPE, INCOMING_TYPE, MISSED_TYPE
	 * @param typeFiltre Array di boolean con filtro tipo di chiamate che vogliamo recuperare. Possono essere piu combinate.
	 * @return boolean true se effettivamente e' una chiamata in uscita
	 */
	private boolean filtroTypeCall(String type, boolean[] typeFiltre)
	{
		boolean risultatoFiltroOk = false; 
 
    	try
    	{
    		int dircode = Integer.parseInt( type );
    		switch( dircode ) 
    		{
    			case CallLog.Calls.OUTGOING_TYPE: // 2 
    				risultatoFiltroOk = (typeFiltre[CallLog.Calls.OUTGOING_TYPE]);
    			break;

    			case CallLog.Calls.INCOMING_TYPE: // 1 
    				risultatoFiltroOk = (typeFiltre[CallLog.Calls.INCOMING_TYPE]);
    			break;

    			case CallLog.Calls.MISSED_TYPE: // 3 
    				risultatoFiltroOk = (typeFiltre[CallLog.Calls.MISSED_TYPE]);
    			break;
    			default:
    				risultatoFiltroOk = (typeFiltre[0]);
    			break;
    		}
    	} catch( NumberFormatException e )
    	{
    		risultatoFiltroOk = false;
    		e.printStackTrace();
    	}
    	
    	return risultatoFiltroOk;
	}
	
	// ******************************************************************************************************************
	// *** 											        METODI:  											      ***
	// ***									    Metodi public per recuperare dati da fuori		     				  ***
	// ******************************************************************************************************************
	
	/**
	 * Metodo che muove il cursore.
	 * @see TODO: Da implementare l'estrazione personalizzata del parametriEstrazioneQuery.
	 * @see TODO: Aggiungere costruzione totale minuti
	 * @return Una mappa con chiave 'numero telefono', mentre valore
	 * il BeanChiamateNumero con informazioni riguardo quel numero(esempio durata chiaamte) e un array di chiamate.
	 */
	public LinkedHashMap<String,BeanChiamateNumero> eseguiSelectRegistroChiamate()
	{

		LinkedHashMap<String,BeanChiamateNumero> mappaNumeroChiamate = new LinkedHashMap<String,BeanChiamateNumero>();
		
		ArrayList<BeanChiamata> listaChiamate;
		
		BeanChiamateNumero beanChiamateNumero;
		
		String numeroTelefono;
		String tipoChiamata;
		long   durataChiamata;
		long   dataChiamata;
		
		if (cursor != null)
		{			
			
			// Setto le colonne dove recuperare
			int numeroTelefonoColumn = cursor.getColumnIndex(CallLog.Calls.NUMBER);
			int tipoChiamataColumn   = cursor.getColumnIndex(CallLog.Calls.TYPE);
			int durataChiamataColumn = cursor.getColumnIndex(CallLog.Calls.DURATION);
			int dataChiamataColumn   = cursor.getColumnIndex(CallLog.Calls.DATE);
			
			BeanChiamata beanChiamata;
			
			while (cursor.moveToNext())
			{
				
				tipoChiamata   = cursor.getString(tipoChiamataColumn);
				
				if (filtroTypeCall(tipoChiamata, filtroTipoChiamata))
				{
					numeroTelefono = cursor.getString(numeroTelefonoColumn);
					durataChiamata = cursor.getLong(durataChiamataColumn);
					dataChiamata   = cursor.getLong(dataChiamataColumn);
					tipoChiamata   = cursor.getString(tipoChiamataColumn);
					
					beanChiamata = new BeanChiamata();
					
					beanChiamata.setNumeroTelefono(numeroTelefono);
					beanChiamata.setTipoChiamata(tipoChiamata);
					beanChiamata.setDurataChiamata(durataChiamata);
					beanChiamata.setDataChiamata(dataChiamata);
					

					beanChiamateNumero = mappaNumeroChiamate.get(numeroTelefono);
					
					if (beanChiamateNumero == null)
					{
						listaChiamate = new ArrayList<BeanChiamata>();
						
						beanChiamateNumero = new BeanChiamateNumero();
						beanChiamateNumero = Utility.appendChiamate(listaChiamate,beanChiamata,beanChiamateNumero);												
						mappaNumeroChiamate.put(numeroTelefono, beanChiamateNumero);				
					} else
					{
						listaChiamate = beanChiamateNumero.getListaChiamate();

						beanChiamateNumero = Utility.appendChiamate(listaChiamate,beanChiamata,beanChiamateNumero);
							
					}
				}
			}
			cursor.close();
		}
		return mappaNumeroChiamate;
	}
	
}